import functools
import logging
from logging.handlers import RotatingFileHandler
from flask import session,g,jsonify
from ihome.utils.response_code import RET
# 定义校验登录状态的装饰器
def login_required(view_func):

    # 这个装饰器写在内层函数中，函数的形参就是外部函数的形参，这样可以改变一下特性
    @functools.wraps(view_func)
    def wrapper(*args,**kwargs):
        # 判断用户的登录状态
        user_id = session.get("user_id")
        # 如果用户已经登录，进入视图函数
        if user_id is not None:
            # 在一次请求中如果涉及多个函数直接传递参数，可以直接使用g对象
            # 将user_id保存到g对象中，在视图函数中可以通过g对象获取保存的数据
            g.user_id = user_id
            return view_func(*args,**kwargs)
        else:
            # 如果用户未登录，返回未登录信息
            return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")

    return wrapper

# login_required(set_avatar)===>wrapper
# 当用户调用set_avatar()的时候相当于用户在调用wrapper()函数
# @表示函数调用

# 装饰器装饰函的过程
# @login_required
#def set_avatar():
#     pass
# @login_required ===》login_required(set_avatar)===》wrapper

# 调用函数：wrapper()===> return view_func(*args,**kwargs)==>return set_avatar()
# 使用装饰器的好处：在不改变原有函数功能的基础上增加额外功能
@login_required
def set_avatar():
    user_id = g.user_id
    return "OK"




from werkzeug.routing import BaseConverter
# 1. 自定义转换器
class ReConverter(BaseConverter):
    def __init__(self,url_map,regex):
        """
        :param url_map: 系统自动调用当前转换器时自动赋值
        :param regex: 用户传入的参数
        """
        # 调用父类同名的构造函数完成本来应该完成的工作
        super().__init__(url_map)
        print("== ReConverter.__init__(self,url_map=%s,regex=%s)=="%(url_map,regex))
        # 将我们传递的正则表达式传递给当前BaseConverter对象的属性regex后系统自动进行验证
        self.regex = regex


# 设置日志级别
def set_log_level(log_level):
    logging.basicConfig(level=log_level) # 当前日志级别设置为调试级别
    file_log_handler = RotatingFileHandler(
        "logs/log",# 指定生成的日志文件存储的路径
        maxBytes=1024*1024*10, # 指定单个日志文件达到这个值后开始旋转
        # maxBytes=10, # 指定单个日志文件达到这个值后开始旋转
        backupCount=10 # 只保留最近生成的10个文件
    )
    formatter = logging.Formatter("%(levelname)s %(filename)s %(lineno)d %(message)s")
    file_log_handler.setFormatter(formatter)
    logging.getLogger().addHandler(file_log_handler)

# 封装输出日志的功能
def output_log(debug="debug msg",info="info msg",warning="warning msg",error="error msg"):
    logging.debug(debug)
    logging.info(info)
    logging.warning(warning)
    logging.error(error)